﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using SAAC.DTO;
using System.Data;

namespace SAAC.DAL
{
	public class ProcessoDAL : DALBase
	{

		public ProcessoDTO Select(ProcessoDTO dto, string order = null)
		{
			try
			{
				string sql = "CALL sp_processo_sel(@numero,@abertura,@termino,@status,@colegiadoId,@funcionarioMatricula,@professorMatricula,@order,@limit);";

				if (dto.FuncionarioCriador == null) dto.FuncionarioCriador = new FuncionarioDTO();
				if (dto.Colegiado == null) dto.Colegiado = new ColegiadoDTO();
				if (dto.ProfessorResponsavel == null) dto.ProfessorResponsavel = new ProfessorDTO();

				MySqlCommand cmd = new MySqlCommand(sql, con);
				cmd.Parameters.AddWithValue("@numero", dto.Numero);
				cmd.Parameters.AddWithValue("@abertura", dto.Abertura);
				cmd.Parameters.AddWithValue("@termino", dto.Termino);
				cmd.Parameters.AddWithValue("@status", (int?)dto.Status);
				cmd.Parameters.AddWithValue("@colegiadoId", dto.Colegiado.Id);
				cmd.Parameters.AddWithValue("@funcionarioMatricula", dto.FuncionarioCriador.Matricula);
				cmd.Parameters.AddWithValue("@professorMatricula", dto.ProfessorResponsavel.Matricula);
				cmd.Parameters.AddWithValue("@order", order);
				cmd.Parameters.AddWithValue("@limit", 1);

				con.Open();
				MySqlDataReader dr;

				dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

				if (dr.Read())
				{
					dto.Numero = dr["numero"].ToString();
					dto.Abertura = Convert.ToDateTime(dr["abertura"]);
					dto.Termino = DBNull.Value.Equals(dr["termino"]) ? (DateTime?)null : Convert.ToDateTime(dr["termino"]);
					dto.Status = (EStatusProcesso)Convert.ToInt32((dr["status"]));
					dto.Colegiado.Id = Convert.ToInt32(dr["Colegiado_idColegiado"]);
					dto.FuncionarioCriador.Matricula = Convert.ToInt32(dr["Funcionario_matricula"]);
					dto.ProfessorResponsavel.Matricula = DBNull.Value.Equals(dr["Professor_matricula"]) ? (int?)null : Convert.ToInt32(dr["Professor_matricula"]);
				}
				else dto = null;

				return dto;
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				con.Close();
			}
		}

		public List<ProcessoDTO> SelectAll(ProcessoDTO dto, string order = null, int limit = 1000)
		{
			try
			{
				string sql = "CALL sp_processo_sel(@numero,@abertura,@termino,@status,@colegiadoId,@funcionarioMatricula,@professorMatricula,@order,@limit);";

				if (dto.FuncionarioCriador == null) dto.FuncionarioCriador = new FuncionarioDTO();
				if (dto.Colegiado == null) dto.Colegiado = new ColegiadoDTO();
				if (dto.ProfessorResponsavel == null) dto.ProfessorResponsavel = new ProfessorDTO();
				var lista = new List<ProcessoDTO>();

				MySqlCommand cmd = new MySqlCommand(sql, con);
				cmd.Parameters.AddWithValue("@numero", dto.Numero);
				cmd.Parameters.AddWithValue("@abertura", dto.Abertura);
				cmd.Parameters.AddWithValue("@termino", dto.Termino);
				cmd.Parameters.AddWithValue("@status", (int?)dto.Status);
				cmd.Parameters.AddWithValue("@colegiadoId", dto.Colegiado.Id);
				cmd.Parameters.AddWithValue("@funcionarioMatricula", dto.FuncionarioCriador.Matricula);
				cmd.Parameters.AddWithValue("@professorMatricula", dto.ProfessorResponsavel.Matricula);
				cmd.Parameters.AddWithValue("@order", order);
				cmd.Parameters.AddWithValue("@limit", limit);

				con.Open();
				MySqlDataReader dr;

				dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

				while (dr.Read())
				{
					var item = new ProcessoDTO();

					if (item.FuncionarioCriador == null) item.FuncionarioCriador = new FuncionarioDTO();
					if (item.Colegiado == null) item.Colegiado = new ColegiadoDTO();
					if (item.ProfessorResponsavel == null) item.ProfessorResponsavel = new ProfessorDTO();

					item.Numero = dr["numero"].ToString();
					item.Abertura = Convert.ToDateTime(dr["abertura"]);
					item.Termino = DBNull.Value.Equals(dr["termino"]) ? (DateTime?)null : Convert.ToDateTime(dr["termino"]);
					item.Status = (EStatusProcesso)Convert.ToInt32((dr["status"]));
					item.Colegiado.Id = Convert.ToInt32(dr["Colegiado_idColegiado"]);
					item.FuncionarioCriador.Matricula = Convert.ToInt32(dr["Funcionario_matricula"]);
					item.ProfessorResponsavel.Matricula = DBNull.Value.Equals(dr["Professor_matricula"]) ? (int?)null : Convert.ToInt32(dr["Professor_matricula"]);
					lista.Add(item);
				}

				return lista;
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				con.Close();
			}
		}

		public void Insert(ProcessoDTO dto)
		{
			try
			{
				String sql = @"CALL sp_processo_ins(@numero,@abertura,@termino,@status,@colegiadoId,@funcionarioMatricula,@professorMatricula);";

                if (dto.FuncionarioCriador == null) dto.FuncionarioCriador = new FuncionarioDTO();
                if (dto.Colegiado == null) dto.Colegiado = new ColegiadoDTO();
                if (dto.ProfessorResponsavel == null) dto.ProfessorResponsavel = new ProfessorDTO();

				MySqlCommand cmd = new MySqlCommand(sql, con);

				cmd.Parameters.AddWithValue("@numero", dto.Numero);
				cmd.Parameters.AddWithValue("@abertura", dto.Abertura);
				cmd.Parameters.AddWithValue("@termino", dto.Termino);
				cmd.Parameters.AddWithValue("@status", (int?)dto.Status);
				cmd.Parameters.AddWithValue("@colegiadoId", dto.Colegiado.Id);
				cmd.Parameters.AddWithValue("@funcionarioMatricula", dto.FuncionarioCriador.Matricula);
				cmd.Parameters.AddWithValue("@professorMatricula", dto.ProfessorResponsavel.Matricula);

				con.Open();
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				con.Close();
			}
		}

		public void Update(ProcessoDTO dto)
		{
			try
			{
				String sql = "CALL sp_processo_upd(@numero,@abertura,@termino,@status,@colegiadoId,@funcionarioMatricula,@professorMatricula);";

				MySqlCommand cmd = new MySqlCommand(sql, con);

				cmd.Parameters.AddWithValue("@numero", dto.Numero);
				cmd.Parameters.AddWithValue("@abertura", dto.Abertura);
				cmd.Parameters.AddWithValue("@termino", dto.Termino);
				cmd.Parameters.AddWithValue("@status", (int?)dto.Status);
				cmd.Parameters.AddWithValue("@colegiadoId", dto.Colegiado.Id);
				cmd.Parameters.AddWithValue("@funcionarioMatricula", dto.FuncionarioCriador.Matricula);
				cmd.Parameters.AddWithValue("@professorMatricula", dto.ProfessorResponsavel.Matricula);

				con.Open();
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				con.Close();
			}
		}

		public void Delete(ProcessoDTO dto)
		{
			try
			{
				String sql = "CALL sp_processo_del(@numero);";

				MySqlCommand cmd = new MySqlCommand(sql, con);

				cmd.Parameters.AddWithValue("@numero", dto.Numero);
				con.Open();
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				con.Close();
			}
		}
	}
}
